# 函数
"""
作用域 LEGB

L local 本地 局部变量
E ENCLOSING 嵌套
G GLOBAL 全局
B built-in 内置

"""

# print(max)
from functools import reduce

"""
匿名函数：简化函数定义
格式: lambda 参数1,参数2... ： 运算

"""
add1 = lambda a, b: a + b
print(add1)
print(add1(2, 3))

p = lambda *args, **kwargs: print(args, kwargs)

params = [1, 2, 3, 4]
dict_1 = {"name": "张三", "age": 10}
p(*params, **dict_1)

"""
匿名函数作为参数
"""


def func(x, y, func):
    print(x, y)
    return func(x, y)


res = func(2, 4, lambda x, y: x * y)

print(res)

# 匿名函数与内置函数的结合使用
list1 = [3, 4, 5, 2, 3, 9, 23, 4]
print("列表的最大值:", max(list1))
list2 = [{"a": 10, "b": 22}, {"a": 13, "b": 20}, {"a": 1, "b": 20}, {"a": 100, "b": 23}]
print("列表的a最大值:", max(list2, key=lambda x: x['b']))

res = map(lambda x: x + 2, list1)
print(list(res))

func = lambda x: x if x % 2 == 0 else x + 1
print(list(map(func, list1)))

res = reduce(lambda x, y: x - y, (80,), 10)
print(res)

res = filter(lambda x: x >= 5, list1)
print(list(res))

res = sorted(list1, key=lambda x: x, reverse=False)
print(res)

# 递归函数
"""
普通函数： def func([参数1,参数2,...]): pass
匿名函数： lambda 参数1,参数2,... : 返回结果
递归函数:  普通函数的一种形式
        函数自己调用自己

递归函数特点：
1. 递归函数必须要设定终点
2. 通常都会有一个入口

"""


def mysum(n):
    if n == 0:
        return 0
    else:
        return n + mysum(n - 1)


res = mysum(100)
print(res)
print("*" * 100)


def mysum1(x, y):
    if x == y:
        return y
    else:
        return x + mysum1(x + 1, y)


res = mysum1(99, 100)
print(res)
